#include <iostream>
#include "historique.h"
#include "mainwindow.h"

using namespace std;

Historique::Historique()
{
}


Historique::~Historique()
{
    viderRetablir();
    viderAnnuler();
}


vector<ElementHistorique*>* Historique::getPileAnnuler() {
    return &pileAnnuler;
}

vector<ElementHistorique*>* Historique::getPileRetablir() {
    return &pileRetablir;
}


void Historique::ajouter(ElementHistorique* elm)
{
    //On ajoute un élément tant que la pile n'est pas pleine
    //Si elle est pleine on retire l'élément le plus vieux
    if(pileAnnuler.size() == maxpile) {
        delete pileAnnuler.front();
        pileAnnuler.erase(pileAnnuler.begin());
    }
    pileAnnuler.push_back(elm);
    viderRetablir();
    mainWindow->getUi()->actionAnnuler->setEnabled(true);

}

ElementHistorique* Historique::annuler() {
    //annuler active refaire
    this->mainWindow->getUi()->actionRefaire->setEnabled(true);

    if(pileRetablir.size() == maxpile) {
        delete pileAnnuler.front();
        pileRetablir.erase(pileRetablir.begin());
    }
    //on met a jour l'historique
    QMdiSubWindow *sousFenetre = mainWindow->getMdiArea()->activeSubWindow();
    FenetreImage* fi = (FenetreImage*) sousFenetre->widget();
    Calque *copie = fi->getCalqueCourant()->copie();
    ElementHistorique* eh = new ElementHistorique(QString(""), copie);
    pileRetablir.push_back(eh);

    ElementHistorique* elm = pileAnnuler.back();
    eh->setInfo(*elm->getInfo());

    pileAnnuler.pop_back();
    //si on rétablit le dernier élément on désactive l'option annuler
    if(pileAnnuler.empty()){
       mainWindow->getUi()->actionAnnuler->setEnabled(false);
    }
    return elm;
}

ElementHistorique* Historique::refaire() {
    //refaire active annuler
    mainWindow->getUi()->actionAnnuler->setEnabled(true);

    if(pileAnnuler.size() == maxpile) {
        delete pileRetablir.front();
        pileAnnuler.erase(pileAnnuler.begin());
    }

    QMdiSubWindow *sousFenetre = mainWindow->getMdiArea()->activeSubWindow();
    FenetreImage* fi = (FenetreImage*) sousFenetre->widget();
    //on met a jour l'historique
    Calque *copie = fi->getCalqueCourant()->copie();
    ElementHistorique* eh = new ElementHistorique(QString(""), copie);
    pileAnnuler.push_back(eh);

    ElementHistorique* elm = pileRetablir.back();
    eh->setInfo(*elm->getInfo());
    pileRetablir.pop_back();
    //si on rétablit le dernier élément on désactive l'option rétablir
    if(pileRetablir.empty()){
        mainWindow->getUi()->actionRefaire->setEnabled(false);
    }
    mainWindow->historique->refaire(elm);
    return elm;
}


void Historique::viderRetablir() {
    while( !pileRetablir.empty()) {
        delete pileRetablir.back();
        pileRetablir.pop_back();
    }
    mainWindow->getUi()->actionRefaire->setEnabled(false);
}

void Historique::viderAnnuler() {
    while( !pileAnnuler.empty()) {
        delete pileAnnuler.back();
        pileAnnuler.pop_back();
    }
    mainWindow->getUi()->actionAnnuler->setEnabled(false);
}

void Historique::setMainWindow(MainWindow *m){
    mainWindow = m;
}
